home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_12_06
/
allison
/
merge1.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-04-08
|
2KB
|
78 lines
LISTING 5 - C implementation of Listing 3
/* merge1.c: Merge two sorted files to standard output */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main(int argc, char *argv[])
{
FILE *f1, *f2;
char buf1[BUFSIZ], buf2[BUFSIZ];
/* Open files */
if (argc != 3)
return EXIT_FAILURE;
f1 = fopen(argv[1],"r");
f2 = fopen(argv[2],"r");
if (!f1 || !f2)
return EXIT_FAILURE;
/* Do the merge */
fgets(buf1,BUFSIZ,f1);
fgets(buf2,BUFSIZ,f2);
while (!feof(f1) && !feof(f2))
{
/* INVARIANT: both buffers have fresh lines */
/* Print and refresh the appropriate line */
if (strcmp(buf1,buf2) <= 0)
{
fputs(buf1,stdout);
fgets(buf1,BUFSIZ,f1);
}
else
{
fputs(buf2,stdout);
fgets(buf2,BUFSIZ,f2);
}
}
/* INVARIANT: At least one file has been exhausted */
/* Empty the remaining file */
while (!feof(f1))
{
/* INVARIANT: buffer-1 has a fresh line */
fputs(buf1,stdout);
fgets(buf1,BUFSIZ,f1);
}
/* INVARIANT: file1 has been exhausted */
fclose(f1);
while (!feof(f2))
{
/* INVARIANT: buffer-2 has a fresh line */
fputs(buf2,stdout);
fgets(buf2,BUFSIZ,f2);
}
/* INVARIANT: file2 has been exhausted */
fclose(f2);
return EXIT_SUCCESS;
}
/* Sample execution:
c:>merge1 file1.dat file2.dat
brown
dog
fox
jumped
lazy
over
quick
the
the
*/